Component-based, distributed software systems continue to increase in popularity. Components are blocks of functionality with published interfaces, and in some architectures may be considered fundamental units of distributed deployment. Components might be, for example, dynamically loaded modules (for example, .dll files) within containers such as executables (for example, .exe files in a Microsoft Windows-based system). In a distributed computing environment, if a component provides another component with access to an internal data model, the components may assume the roles of server and client within the context of that data access. A particular component may be a server in one context and a client in another. A server-client component pair may be local, both components being within a single container, or remote, the components being within different containers. Often, remote component pairs are separated by a network.
Techniques used for optimizing performance in component-based, distributed software systems are typically different depending upon whether the components in a component pair are local or remote. To achieve acceptable performance optimization, it is generally necessary to implement at least two sets of code for each component—one set of code to be used when the client-server relationship is local and the other set of code to be used when the client-server relationship is remote. When a client-server relationship is established between two components, the components must determine whether the relationship is local or remote and then execute the corresponding code. Furthermore, a component that may act as a client with respect to multiple types of server components must typically have two sets of code for each such server component. Such requirements add complexity and cost to the component development process, while potentially decreasing reliability.